home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 9 / FM Towns Free Software Collection 9.iso / t_os / tool / otohime / src / otosub.c < prev   
Text File  |  1994-11-16  |  28KB  |  1,175 lines

  1. /* 音姫 main sub 1993 12/26 */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <winb.h>
  7. #include <te.h>
  8. #include <fntb.h>
  9. #include <gui.h>
  10. #include <file_dlg.h>
  11. #include <egb.h>
  12. #include <mos.h>
  13. #include <snd.h>
  14. #include "otohime.h"
  15. #include "otolib.h"
  16.  
  17. /* about */
  18. int    alertId = -1 ;
  19. int    messageId[3] = -1 ;
  20. int    dspIconId = -1 ;
  21. int    aboutOKBtnId = -1 ;
  22.  
  23. /* information */
  24. int    infDialogId = -1 ;
  25. int    infMsgId[8] = -1 ;
  26. int    infNumId[6] = -1 ;
  27. int    infOkBtnId = -1 ;
  28.  
  29. /* desk */
  30. int    baseDialogId = -1 ;
  31. int    menubarId = -1 ;
  32. int    menuId = -1 ;
  33. int    mItemId[3] = -1 ;
  34. int    SDKmenuId = -1 ;
  35. int    SDKmItemId[3] = -1 ;
  36. int    fileMenuId = -1 ;
  37. int    fileMItemId[8] = -1 ;
  38. int    effMenuId = -1 ;
  39. int    effMItemId[14] = -1 ;
  40. int    quitIconId = -1 ;
  41. int    errorId = -1 ;
  42. int    errorOKBtnId = -1 ;
  43. int    errorIconId = -1 ;
  44. int    errormessage[2] = -1 ;
  45.  
  46. int    sndBufSize ;
  47. char * sndBuf1 ;
  48. char * sndBuf2 ;
  49.  
  50.     /* 各コマンド呼び出し */
  51.  
  52. char sndFileName[100] ;
  53.  
  54. /* ファイル */
  55.  
  56. /* load */
  57. int    selectFunc0(kobj, messId, argc, pev, trigger)
  58. int        kobj ;
  59. int        messId ;
  60. int        argc ;
  61. EVENT    *pev ;
  62. int        trigger ;
  63. {
  64.     char path[100] ;
  65.     char *ExtStr[] = { "*.SND", NULL } ;
  66.     int i,ret ;
  67.  
  68.     /* メニューとボタンを使えないようにする */
  69.     MTL_setAtrObj( menubarId, MS_DSPONLYL40 ) ;
  70.     MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;
  71.  
  72.     sndBufTrans() ;        /* サウンドデータ退避 */
  73.  
  74.     ret = fileSelecter( sndFileName, ExtStr,
  75.                             "読  込", "実  行", "取  消");
  76.  
  77.     if( ret == NOERR )
  78.     {
  79.         /* name , kakuchou[拡張子(.***)] → fullname = name + kakuchou */
  80.         file_kakuchousi_set( path, sndFileName, ".SND" ) ;
  81.         for( i=0 ; i<100 ; i++ )
  82.             sndFileName[i] = path[i] ;
  83.  
  84.         ret = pcmSndRead( sndFileName ) ;
  85.         if( ret )
  86.             errorCheck( ret ) ;
  87.     }
  88.  
  89.     /* メニューとボタンを使えるように戻す */
  90.     MTL_resetAtrObj( menubarId, (~MS_DSPONLYL40) ) ;
  91.     MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
  92.  
  93.     return NOERR ;
  94. }
  95.  
  96. /* 重ね合わせ */
  97. int    selectFunc1(kobj, messId, argc, pev, trigger)
  98. int        kobj ;
  99. int        messId ;
  100. int        argc ;
  101. EVENT    *pev ;
  102. int        trigger ;
  103. {
  104.     char path[100] ;
  105.     char *ExtStr[] = { "*.SND", NULL } ;
  106.     int i,ret ;
  107.  
  108.     /* メニューとボタンを使えないようにする */
  109.     MTL_setAtrObj( menubarId, MS_DSPONLYL40 ) ;
  110.     MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;
  111.  
  112.     sndBufTrans() ;        /* サウンドデータ退避 */
  113.  
  114.     ret = fileSelecter( sndFileName, ExtStr,
  115.                             "重ね合わせ", "選  択", "取  消");
  116.  
  117.     if( ret == NOERR )
  118.     {
  119.         /* name , kakuchou[拡張子(.***)] → fullname = name + kakuchou */
  120.         file_kakuchousi_set( path, sndFileName, ".SND" ) ;
  121.         for( i=0 ; i<100 ; i++ )
  122.             sndFileName[i] = path[i] ;
  123.  
  124.         ret = pcmSndRead( sndFileName ) ;
  125.         if( ret )
  126.             errorCheck( ret ) ;
  127.         else
  128.             sndMix() ;
  129.     }
  130.  
  131.     /* メニューとボタンを使えるように戻す */
  132.     MTL_resetAtrObj( menubarId, (~MS_DSPONLYL40) ) ;
  133.     MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
  134.  
  135.     return NOERR ;
  136. }
  137.  
  138.     /* SNDファイルを読み込む */
  139. int pcmSndRead( char *name )
  140. {
  141.     FILE *fp ;        /* ファイルのストリーム情報を記憶する変数のポインタ */
  142.     int len ;        /* SNDデータのデータ幅 */
  143.     SNDHEAD head ;    /* SNDデータのヘッダの内容が入る構造体変数 */
  144.  
  145.     if( ( fp = fopen( name, "rb" ) ) == NULL )    /* ファイルオープン */
  146.     {
  147.         return CANT_LOAD ;        /* オープンできなかったらエラーを返す */
  148.     }
  149.  
  150.     if( fread( &head, 32, 1, fp ) < 1 )    /* ヘッダ読み込み */
  151.     {
  152.         fclose( fp ) ;              /* 読み込めない場合はまずクローズする */
  153.         return CANT_LOAD ;        /* エラーを返す */
  154.     }
  155.  
  156.     len = head.length ;            /* データ幅を取得 */
  157.  
  158.     if( len > (sndBufSize - 32) ) /* メモリのcheck */
  159.     {
  160.         fclose( fp ) ;          /* メモリが足りない場合まずクローズする */
  161.         return OUT_OF_MEMORY ;    /* エラーを返す */
  162.     }
  163.  
  164.     fseek( fp, 0, SEEK_SET ); /* ファイルのストリームの位置を0に戻す */
  165.  
  166.     if( fread( sndBuf1, len+32, 1, fp ) < 1 )      /* バッファに読み込み */
  167.     {
  168.         fclose( fp ) ;              /* クローズする */
  169.         return CANT_LOAD ;        /* エラーを返す */
  170.     }
  171.  
  172.     fclose( fp ) ;                    /* クローズ */
  173.  
  174.     return NOERR ;
  175. }
  176.  
  177. /* save */
  178. int    selectFunc2(kobj, messId, argc, pev, trigger)
  179. int        kobj ;
  180. int        messId ;
  181. int        argc ;
  182. EVENT    *pev ;
  183. int        trigger ;
  184. {
  185.     char path[100] ;
  186.     char *ExtStr[] = { "*.SND", NULL } ;
  187.     int i,ret ;
  188.  
  189.     /* メニューとボタンを使えないようにする */
  190.     MTL_setAtrObj( menubarId, MS_DSPONLYL40 ) ;
  191.     MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;
  192.  
  193.     ret = fileSelecter( sndFileName, ExtStr,
  194.                             "保  存", "実  行", "取  消");
  195.  
  196.     if( ret == NOERR )
  197.     {
  198.         /* name , kakuchou[拡張子(.***)] → fullname = name + kakuchou */
  199.         file_kakuchousi_set( path, sndFileName, ".SND" ) ;
  200.         for( i=0 ; i<100 ; i++ )
  201.             sndFileName[i] = path[i] ;
  202.  
  203.         ret = pcmSndWrite( sndFileName ) ;
  204.         if( ret )
  205.             errorCheck( ret ) ;
  206.     }
  207.  
  208.     /* メニューとボタンを使えるように戻す */
  209.     MTL_resetAtrObj( menubarId, (~MS_DSPONLYL40) ) ;
  210.     MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
  211.  
  212.     return NOERR ;
  213. }
  214.  
  215.     /* SNDファイルを書き込む */
  216. int pcmSndWrite( char *name )
  217. {
  218.     FILE *fp ;        /* ファイルのストリーム情報を記憶する変数のポインタ */
  219.     int len ;        /* SNDデータのデータ幅 */
  220.     SNDHEAD *head ;    /* SNDデータのヘッダの内容が入る構造体変数 */
  221.  
  222.     if( ( fp = fopen( name, "wb" ) ) == NULL )    /* ファイルオープン */
  223.     {
  224.         return CANT_SAVE ;        /* オープンできなかったらエラーを返す */
  225.     }
  226.  
  227.     head = (SNDHEAD *)sndBuf1 ;
  228.     len = head->length ;            /* データ幅を取得 */
  229.  
  230.     if( len > (sndBufSize - 32) ) /* 大きさのcheck */
  231.     {
  232.         head->length = sndBufSize - 32 ;
  233.         len = sndBufSize - 32 ;
  234.     }
  235.  
  236.     if( fwrite( sndBuf1, len+32, 1, fp ) < 1 )      /* 書き込み */
  237.     {
  238.         fclose( fp ) ;              /* クローズする */
  239.         return CANT_SAVE ;        /* エラーを返す */
  240.     }
  241.  
  242.     fclose( fp ) ;                    /* クローズ */
  243.  
  244.     return NOERR ;
  245. }
  246.  
  247. /* rec */
  248. int    selectFunc3(kobj, messId, argc, pev, trigger)
  249. int        kobj ;
  250. int        messId ;
  251. int        argc ;
  252. EVENT    *pev ;
  253. int        trigger ;
  254. {
  255.     /* メニューとボタンを使えないようにする */
  256.     MTL_setAtrObj( menubarId, MS_DSPONLYL40 ) ;
  257.     MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;
  258.  
  259.     sndBufTrans() ;        /* サウンドデータ退避 */
  260.  
  261.     sndRec() ;
  262.  
  263.     /* メニューとボタンを使えるように戻す */
  264.     MTL_resetAtrObj( menubarId, (~MS_DSPONLYL40) ) ;
  265.     MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
  266.  
  267.     return NOERR ;
  268. }
  269.  
  270. /* play */
  271. int    selectFunc4(kobj, messId, argc, pev, trigger)
  272. int        kobj ;
  273. int        messId ;
  274. int        argc ;
  275. EVENT    *pev ;
  276. int        trigger ;
  277. {
  278.     sndPlay() ;
  279.     return NOERR ;
  280. }
  281.  
  282.  
  283. /* 効果 */
  284.  
  285. /* echo */
  286. int    effFunc0(kobj, messId, argc, pev, trigger)
  287. int        kobj ;
  288. int        messId ;
  289. int        argc ;
  290. EVENT    *pev ;
  291. int        trigger ;
  292. {
  293.     /* メニューとボタンを使えないようにする */
  294.     MTL_setAtrObj( menubarId, MS_DSPONLYL40 ) ;
  295.     MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;
  296.  
  297.     sndBufTrans() ;        /* サウンドデータ退避 */
  298.  
  299.     sndEffectEcho() ;
  300.  
  301.     /* メニューとボタンを使えるように戻す */
  302.     MTL_resetAtrObj( menubarId, (~MS_DSPONLYL40) ) ;
  303.     MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
  304.  
  305.     return NOERR ;
  306. }
  307.  
  308. /* phase */
  309. int    effFunc1(kobj, messId, argc, pev, trigger)
  310. int        kobj ;
  311. int        messId ;
  312. int        argc ;
  313. EVENT    *pev ;
  314. int        trigger ;
  315. {
  316.     /* メニューとボタンを使えないようにする */
  317.     MTL_setAtrObj( menubarId, MS_DSPONLYL40 ) ;
  318.     MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;
  319.  
  320.     sndBufTrans() ;        /* サウンドデータ退避 */
  321.  
  322.     sndEffectPhaseShift() ;
  323.  
  324.     /* メニューとボタンを使えるように戻す */
  325.     MTL_resetAtrObj( menubarId, (~MS_DSPONLYL40) ) ;
  326.     MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
  327.  
  328.     return NOERR ;
  329. }
  330.  
  331. /* vibrato */
  332. int    effFunc2(kobj, messId, argc, pev, trigger)
  333. int        kobj ;
  334. int        messId ;
  335. int        argc ;
  336. EVENT    *pev ;
  337. int        trigger ;
  338. {
  339.     /* メニューとボタンを使えないようにする */
  340.     MTL_setAtrObj( menubarId, MS_DSPONLYL40 ) ;
  341.     MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;
  342.  
  343.     sndBufTrans() ;        /* サウンドデータ退避 */
  344.  
  345.     sndEffectVibrato() ;
  346.  
  347.     /* メニューとボタンを使えるように戻す */
  348.     MTL_resetAtrObj( menubarId, (~MS_DSPONLYL40) ) ;
  349.     MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
  350.  
  351.     return NOERR ;
  352. }
  353.  
  354. /* tremolo */
  355. int    effFunc3(kobj, messId, argc, pev, trigger)
  356. int        kobj ;
  357. int        messId ;
  358. int        argc ;
  359. EVENT    *pev ;
  360. int        trigger ;
  361. {
  362.     /* メニューとボタンを使えないようにする */
  363.     MTL_setAtrObj( menubarId, MS_DSPONLYL40 ) ;
  364.     MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;
  365.  
  366.     sndBufTrans() ;        /* サウンドデータ退避 */
  367.  
  368.     sndEffectTremolo() ;
  369.  
  370.     /* メニューとボタンを使えるように戻す */
  371.     MTL_resetAtrObj( menubarId, (~MS_DSPONLYL40) ) ;
  372.     MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
  373.  
  374.     return NOERR ;
  375. }
  376.  
  377. /* voice changer */
  378. int    effFunc4(kobj, messId, argc, pev, trigger)
  379. int        kobj ;
  380. int        messId ;
  381. int        argc ;
  382. EVENT    *pev ;
  383. int        trigger ;
  384. {
  385.     /* メニューとボタンを使えないようにする */
  386.     MTL_setAtrObj( menubarId, MS_DSPONLYL40 ) ;
  387.     MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;
  388.  
  389.     sndBufTrans() ;        /* サウンドデータ退避 */
  390.  
  391.     sndEffectVoiceChange() ;
  392.  
  393.     /* メニューとボタンを使えるように戻す */
  394.     MTL_resetAtrObj( menubarId, (~MS_DSPONLYL40) ) ;
  395.     MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
  396.  
  397.     return NOERR ;
  398. }
  399.  
  400. /* harmony */
  401. int    effFunc4_2(kobj, messId, argc, pev, trigger)
  402. int        kobj ;
  403. int        messId ;
  404. int        argc ;
  405. EVENT    *pev ;
  406. int        trigger ;
  407. {
  408.     /* メニューとボタンを使えないようにする */
  409.     MTL_setAtrObj( menubarId, MS_DSPONLYL40 ) ;
  410.     MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;
  411.  
  412.     sndBufTrans() ;        /* サウンドデータ退避 */
  413.  
  414.     sndEffectHarmony() ;
  415.  
  416.     /* メニューとボタンを使えるように戻す */
  417.     MTL_resetAtrObj( menubarId, (~MS_DSPONLYL40) ) ;
  418.     MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
  419.  
  420.     return NOERR ;
  421. }
  422.  
  423. /* expander */
  424. int    effFunc5(kobj, messId, argc, pev, trigger)
  425. int        kobj ;
  426. int        messId ;
  427. int        argc ;
  428. EVENT    *pev ;
  429. int        trigger ;
  430. {
  431.     /* メニューとボタンを使えないようにする */
  432.     MTL_setAtrObj( menubarId, MS_DSPONLYL40 ) ;
  433.     MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;
  434.  
  435.     sndBufTrans() ;        /* サウンドデータ退避 */
  436.  
  437.     sndEffectExpand() ;
  438.  
  439.     /* メニューとボタンを使えるように戻す */
  440.     MTL_resetAtrObj( menubarId, (~MS_DSPONLYL40) ) ;
  441.     MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
  442.  
  443.     return NOERR ;
  444. }
  445.  
  446. /* level */
  447. int    effFunc6(kobj, messId, argc, pev, trigger)
  448. int        kobj ;
  449. int        messId ;
  450. int        argc ;
  451. EVENT    *pev ;
  452. int        trigger ;
  453. {
  454.     /* メニューとボタンを使えないようにする */
  455.     MTL_setAtrObj( menubarId, MS_DSPONLYL40 ) ;
  456.     MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;
  457.  
  458.     sndBufTrans() ;        /* サウンドデータ退避 */
  459.  
  460.     sndEffectLevel() ;
  461.  
  462.     /* メニューとボタンを使えるように戻す */
  463.     MTL_resetAtrObj( menubarId, (~MS_DSPONLYL40) ) ;
  464.     MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
  465.  
  466.     return NOERR ;
  467. }
  468.  
  469. /* pitch */
  470. int    effFunc7(kobj, messId, argc, pev, trigger)
  471. int        kobj ;
  472. int        messId ;
  473. int        argc ;
  474. EVENT    *pev ;
  475. int        trigger ;
  476. {
  477.     /* メニューとボタンを使えないようにする */
  478.     MTL_setAtrObj( menubarId, MS_DSPONLYL40 ) ;
  479.     MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;
  480.  
  481.     sndBufTrans() ;        /* サウンドデータ退避 */
  482.  
  483.     sndEffectPitch() ;
  484.  
  485.     /* メニューとボタンを使えるように戻す */
  486.     MTL_resetAtrObj( menubarId, (~MS_DSPONLYL40) ) ;
  487.     MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
  488.  
  489.     return NOERR ;
  490. }
  491.  
  492. /* fade int & out */
  493. int    effFunc8(kobj, messId, argc, pev, trigger)
  494. int        kobj ;
  495. int        messId ;
  496. int        argc ;
  497. EVENT    *pev ;
  498. int        trigger ;
  499. {
  500.     /* メニューとボタンを使えないようにする */
  501.     MTL_setAtrObj( menubarId, MS_DSPONLYL40 ) ;
  502.     MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;
  503.  
  504.     sndBufTrans() ;        /* サウンドデータ退避 */
  505.  
  506.     sndEffectFade() ;
  507.  
  508.     /* メニューとボタンを使えるように戻す */
  509.     MTL_resetAtrObj( menubarId, (~MS_DSPONLYL40) ) ;
  510.     MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
  511.  
  512.     return NOERR ;
  513. }
  514.  
  515. /* sampling rate */
  516. int    effFunc9(kobj, messId, argc, pev, trigger)
  517. int        kobj ;
  518. int        messId ;
  519. int        argc ;
  520. EVENT    *pev ;
  521. int        trigger ;
  522. {
  523.     /* メニューとボタンを使えないようにする */
  524.     MTL_setAtrObj( menubarId, MS_DSPONLYL40 ) ;
  525.     MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;
  526.  
  527.     sndBufTrans() ;        /* サウンドデータ退避 */
  528.  
  529.     sndEffectSampSet() ;
  530.  
  531.     /* メニューとボタンを使えるように戻す */
  532.     MTL_resetAtrObj( menubarId, (~MS_DSPONLYL40) ) ;
  533.     MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
  534.  
  535.     return NOERR ;
  536. }
  537.  
  538. /* write head */
  539. int    effFunc10(kobj, messId, argc, pev, trigger)
  540. int        kobj ;
  541. int        messId ;
  542. int        argc ;
  543. EVENT    *pev ;
  544. int        trigger ;
  545. {
  546.     /* メニューとボタンを使えないようにする */
  547.     MTL_setAtrObj( menubarId, MS_DSPONLYL40 ) ;
  548.     MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;
  549.  
  550.     sndBufTrans() ;        /* サウンドデータ退避 */
  551.  
  552.     sndEffectHead() ;
  553.  
  554.     /* メニューとボタンを使えるように戻す */
  555.     MTL_resetAtrObj( menubarId, (~MS_DSPONLYL40) ) ;
  556.     MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
  557.  
  558.     return NOERR ;
  559. }
  560.  
  561. /* undo */
  562. int    effFunc11(kobj, messId, argc, pev, trigger)
  563. int        kobj ;
  564. int        messId ;
  565. int        argc ;
  566. EVENT    *pev ;
  567. int        trigger ;
  568. {
  569.     /* メニューとボタンを使えないようにする */
  570.     MTL_setAtrObj( menubarId, MS_DSPONLYL40 ) ;
  571.     MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;
  572.  
  573.     unDo() ;
  574.  
  575.     /* メニューとボタンを使えるように戻す */
  576.     MTL_resetAtrObj( menubarId, (~MS_DSPONLYL40) ) ;
  577.     MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
  578.  
  579.     return NOERR ;
  580. }
  581.  
  582.  
  583. /* 情報 */
  584.  
  585. int    information(kobj, messId, argc, pev, trigger)
  586. int        kobj ;
  587. int        messId ;
  588. int        argc ;
  589. EVENT    *pev ;
  590. int        trigger ;
  591. {
  592.     /* メニューとボタンを使えないようにする */
  593.     MTL_setAtrObj( menubarId, MS_DSPONLYL40 ) ;
  594.     MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;
  595.  
  596.     sndInf() ;
  597.  
  598.     /* メニューとボタンを使えるように戻す */
  599.     MTL_resetAtrObj( menubarId, (~MS_DSPONLYL40) ) ;
  600.     MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
  601.  
  602.     return NOERR ;
  603. }
  604.  
  605.  
  606.  
  607. /*
  608.  
  609.         ここからは 汎用サブルーチン
  610.  
  611. */
  612.  
  613. /* name , kakuchou[拡張子(.***)] → fullname = name + kakuchou */
  614.  
  615. file_kakuchousi_set( fullname, name, kakuchou )
  616. char fullname[], name[], kakuchou[];
  617. {
  618.     int i;
  619.  
  620.     for( i=0 ; i<76 ; i++ ){
  621.         fullname[i] = name[i];
  622.         if( name[i] == '.' || name[i] == (char)0 )goto mov01;
  623.     }
  624.     return 55;        /* bad file name */
  625. mov01:    if( i == 0 )return 55;
  626.     if( name[i-1] == '\\' )return 55;
  627.     DWORD( fullname + i ) = DWORD( kakuchou );
  628.     fullname[i+4] = (char)0;
  629.     return 0;
  630. }
  631.  
  632. /*    ファイル選択    */
  633.  
  634. int    fileSelecter( path, ExtStr, title, exec, cncl )
  635. char    *path ;
  636. char    **ExtStr ;
  637. char    *title ;
  638. char    *exec ;
  639. char    *cncl ;
  640. {
  641.     char pathName[100], name[20] ;
  642.     int                 i, j, n ;
  643.     unsigned int    MSlctCnt ;
  644.     int          Atr, ret, ret2 ;
  645.  
  646.     ret2 = NOERR ;
  647.  
  648.     n = 0 ;
  649.     for( i=0 ; i<79 ; i++ )
  650.     {
  651.         pathName[i] = path[i] ;
  652.         if( path[i] == '\\' )
  653.             n++ ;
  654.         if( path[i] == '\0' )
  655.             break ;
  656.     }
  657.     if( n <= 1 )
  658.     {
  659.         for( i=i ; i>=0 ; i-- )
  660.         {
  661.             if( path[i] == '\\' )
  662.             {
  663.                 i++ ;
  664.                 pathName[i] = '\0' ;
  665.                 break ;
  666.             }
  667.         }
  668.         for( j=0 ; j<13 ; j++ )
  669.         {
  670.             name[j] = path[i+j] ;
  671.         }
  672.     }
  673.     else
  674.     {
  675.         for( i=i ; i>=0 ; i-- )
  676.         {
  677.             if( path[i] == '\\' )
  678.             {
  679.                 pathName[i] = '\0' ;
  680.                 break ;
  681.             }
  682.         }
  683.         for( j=0 ; j<13 ; j++ )
  684.         {
  685.             name[j] = path[i+1+j] ;
  686.         }
  687.     }
  688.  
  689.     ret = FDG_SetFileText( name ) ;
  690.     ret = FDG_SetTitle( title, exec, cncl ) ;
  691.     ret = FDG_DspFileDlg(MMI_GetBaseObj(), FDG_FILEONLY | FDG_TEXT,
  692.          pathName, ExtStr,    &MSlctCnt) ;
  693.     if( ret < 0 )    /* PATHが間違ってる場合はカレントディレクトリで */
  694.     {
  695.         name[0] = '\0' ;
  696.         ret = FDG_SetFileText( name ) ;
  697.         ret = FDG_DspFileDlg(MMI_GetBaseObj(), FDG_FILEONLY | FDG_TEXT,
  698.              NULL, ExtStr,    &MSlctCnt) ;
  699.     }
  700.  
  701.     if( (ret == 1) && (MSlctCnt > 0) )    /*    正しくファイル名を収得したか?    */
  702.     {
  703.         FDG_GetPathName( path, &Atr, 0 ) ;
  704.     }
  705.     else
  706.     {
  707.         ret2 = 1 ;
  708.     }
  709.     ret = FDG_RecovCurDir() ;
  710.     return ret2 ;
  711. }
  712.  
  713. /*    パレット設定 */
  714.  
  715. int    setPalette( char *ework )
  716. {
  717.     char    para[16*8+4] ;
  718.     int        ptr, colnum ;
  719.  
  720.     void     set1Pal( int col, int b, int r, int g )
  721.     {
  722.         DWORD(para + ptr) = col ;
  723.         BYTE(para + ptr + 4) = b * 16 ;
  724.         BYTE(para + ptr + 5) = r * 16 ;
  725.         BYTE(para + ptr + 6) = g * 16 ;
  726.         BYTE(para + ptr + 7) = 0 ;
  727.         ptr += 8 ;
  728.     }
  729.  
  730. //    EGB_getTmenuPalette( para ) ;
  731. //    colnum = DWORD(para) ;
  732.  
  733.     colnum = 0 ;        /* 強制的に色設定にしてしまう 1993 12 */
  734.  
  735.     if( colnum == 6 )    ptr = 52 ;
  736.     else                ptr = 4 ;
  737.     if( colnum != 16 )
  738.     {
  739.         set1Pal( 2, 4, 12, 6 ) ;
  740.         set1Pal( 3, 5, 5, 5 ) ;        //         set1Pal( 3, 10, 15, 12 ) ;
  741.         set1Pal( 4, 9, 9, 9 ) ;
  742.         set1Pal( 5, 7, 0, 12 ) ;
  743.         set1Pal( 10, 0, 13, 0 ) ;
  744.         set1Pal( 11, 10, 0, 0 ) ;
  745.         set1Pal( 12, 0, 0, 15 ) ;
  746.         set1Pal( 13, 15, 0, 15 ) ;
  747.         set1Pal( 14, 0, 15, 13 ) ;
  748.         if( colnum != 6 )
  749.         {        /* メニュー色(green系) */
  750.             set1Pal( 1, 4, 4, 8 ) ;
  751.             set1Pal( 6, 12, 12, 12 ) ;
  752.             set1Pal( 7, 7, 7, 7 ) ;
  753.             set1Pal( 8, 2, 2, 2 ) ;
  754.             set1Pal( 9, 8, 10, 12 ) ;    /* file selector */
  755.             set1Pal( 15, 15, 15, 15 ) ;
  756.         }
  757.         DWORD(para + 0) = 15 ;
  758.     }
  759.     else
  760.         DWORD(para + 0) = colnum ;
  761.     EGB_palette( ework, 1, para ) ;
  762.  
  763.     return NOERR ;
  764. }
  765.  
  766. /* 準備 */
  767.  
  768. int startSet()
  769. {
  770.     extern int recTimeNumId ;
  771.     extern int recRateNumId ;
  772.     extern int voicMulNumId ;
  773.     extern int voicMulVolumeId ;
  774.     extern int harmMulNumId ;
  775.     extern int harmMulVolumeId ;
  776.     extern int pitchMulNumId ;
  777.     extern int pitchMulVolumeId ;
  778.     extern int sampRateNumId ;
  779.     extern int headNumId[6] ;
  780.     extern int fadeNumId[4] ;
  781.  
  782.     int ret, timeMax ;
  783.     int var, min, max, delta, ptColumn ;
  784.     int len, page, i ;
  785.  
  786.     /* サウンドバッファの確保 */
  787.  
  788.     ret = getBuffer() ;
  789.     if( ret )return ret ;
  790.  
  791.     /* GUI EDITORの不備のため設定できない部分を設定 */
  792.  
  793.     /* rec */
  794.     timeMax = ( sndBufSize - 32 ) / 19200 * 10 ;
  795.  
  796.     MMI_SendMessage( recTimeNumId, MM_GETNUMBOX, 5, /* 録音時間 */
  797.                             &var, &min, &max, &delta, &ptColumn ) ;
  798.     MMI_SendMessage( recTimeNumId, MM_SETNUMBOX, 5, /* 変更 */
  799.                             var, min, timeMax, delta, ptColumn ) ;
  800.  
  801.     MMI_SendMessage( recRateNumId, MM_GETNUMBOX, 5, /* サンプリングレート */
  802.                             &var, &min, &max, &delta, &ptColumn ) ;
  803.     MMI_SendMessage( recRateNumId, MM_SETNUMBOX, 5, /* 変更 */
  804.                             19200, min, 19200, delta, ptColumn ) ;
  805.  
  806.     /* voice change */
  807.     MMI_SendMessage( voicMulNumId, MM_GETNUMBOX, 5,
  808.                             &var, &min, &max, &delta, &ptColumn ) ;
  809.     MMI_SendMessage( voicMulNumId, MM_SETNUMBOX, 5,
  810.                             300, -1600, 1600, delta, ptColumn ) ;
  811.  
  812.     MMI_SendMessage( voicMulVolumeId, MM_GETSCROLL, 5,
  813.                             &var, &min, &max, &len, &page ) ;
  814.     MMI_SendMessage( voicMulVolumeId, MM_SETSCROLL, 5,
  815.                             30, -160, 160, len, page ) ;
  816.  
  817.     /* harmony */
  818.     MMI_SendMessage( harmMulNumId, MM_GETNUMBOX, 5,
  819.                             &var, &min, &max, &delta, &ptColumn ) ;
  820.     MMI_SendMessage( harmMulNumId, MM_SETNUMBOX, 5,
  821.                             300, -1600, 1600, delta, ptColumn ) ;
  822.  
  823.     MMI_SendMessage( harmMulVolumeId, MM_GETSCROLL, 5,
  824.                             &var, &min, &max, &len, &page ) ;
  825.     MMI_SendMessage( harmMulVolumeId, MM_SETSCROLL, 5,
  826.                             30, -160, 160, len, page ) ;
  827.  
  828.     /* pitch */
  829.     MMI_SendMessage( pitchMulNumId, MM_GETNUMBOX, 5,
  830.                             &var, &min, &max, &delta, &ptColumn ) ;
  831.     MMI_SendMessage( pitchMulNumId, MM_SETNUMBOX, 5,
  832.                             300, -1600, 1600, delta, ptColumn ) ;
  833.  
  834.     MMI_SendMessage( pitchMulVolumeId, MM_GETSCROLL, 5,
  835.                             &var, &min, &max, &len, &page ) ;
  836.     MMI_SendMessage( pitchMulVolumeId, MM_SETSCROLL, 5,
  837.                             30, -160, 160, len, page ) ;
  838.  
  839.     /* sampling rate set */
  840.     MMI_SendMessage( sampRateNumId, MM_GETNUMBOX, 5, /* サンプリングレート */
  841.                             &var, &min, &max, &delta, &ptColumn ) ;
  842.     MMI_SendMessage( sampRateNumId, MM_SETNUMBOX, 5, /* 変更 */
  843.                             19200, min, 50000, delta, ptColumn ) ;
  844.  
  845.     /* write head */
  846.     MMI_SendMessage( headNumId[0], MM_GETNUMBOX, 5,    /* data length */
  847.                             &var, &min, &max, &delta, &ptColumn ) ;
  848.     MMI_SendMessage( headNumId[0], MM_SETNUMBOX, 5, /* 変更 */
  849.                             var, min, sndBufSize - 32, delta, ptColumn ) ;
  850.     MMI_SendMessage( headNumId[1], MM_GETNUMBOX, 5,    /* loop point */
  851.                             &var, &min, &max, &delta, &ptColumn ) ;
  852.     MMI_SendMessage( headNumId[1], MM_SETNUMBOX, 5, /* 変更 */
  853.                             var, min, sndBufSize - 32, delta, ptColumn ) ;
  854.     MMI_SendMessage( headNumId[2], MM_GETNUMBOX, 5,    /* loop length */
  855.                             &var, &min, &max, &delta, &ptColumn ) ;
  856.     MMI_SendMessage( headNumId[2], MM_SETNUMBOX, 5, /* 変更 */
  857.                             var, min, sndBufSize - 32, delta, ptColumn ) ;
  858.     MMI_SendMessage( headNumId[3], MM_GETNUMBOX, 5,    /* freq */
  859.                             &var, &min, &max, &delta, &ptColumn ) ;
  860.     MMI_SendMessage( headNumId[3], MM_SETNUMBOX, 5, /* 変更 */
  861.                             var, min, 65535, delta, ptColumn ) ;
  862.     MMI_SendMessage( headNumId[4], MM_GETNUMBOX, 5,    /* add freq (WORD) */
  863.                             &var, &min, &max, &delta, &ptColumn ) ;
  864.     MMI_SendMessage( headNumId[4], MM_SETNUMBOX, 5, /* 変更 */
  865.                             var, -32768, 32767, delta, ptColumn ) ;
  866.     MMI_SendMessage( headNumId[5], MM_GETNUMBOX, 5,    /* pitch (BYTE) */
  867.                             &var, &min, &max, &delta, &ptColumn ) ;
  868.     MMI_SendMessage( headNumId[5], MM_SETNUMBOX, 5, /* 変更 */
  869.                             var, min, 255, delta, ptColumn ) ;
  870.  
  871.     /* fade in & out */
  872.     for( i=0 ; i<4 ; i++ )
  873.     {
  874.         MMI_SendMessage( fadeNumId[i], MM_GETNUMBOX, 5,
  875.                             &var, &min, &max, &delta, &ptColumn ) ;
  876.         MMI_SendMessage( fadeNumId[i], MM_SETNUMBOX, 5, /* 変更 */
  877.                             var, min, 999999, delta, ptColumn ) ;
  878.     }
  879.  
  880.     return NOERR ;
  881. }
  882.  
  883. int getBuffer()
  884. {
  885.     SNDHEAD *head ;
  886.  
  887.     char *p ;
  888.     int i, block, max ;
  889.     int lot ;
  890.  
  891.     max = ( TL_checkMemory(1) * 4096 ) ;
  892.     max -= 4096*32 ;        /* GUIのために,128kの余裕を取ってあげる */
  893.  
  894.     lot = TL_getLot() ;
  895.     if( (p = (char *)TL_mallocMemory( lot, max )) == NULL )
  896.         return OUT_OF_MEMORY ;
  897.  
  898.     sndBufSize = max / 2 ;
  899.     sndBuf1 = p ;
  900.     sndBuf2 = p + sndBufSize ;
  901.  
  902.     if( sndBufSize < 512 )return OUT_OF_MEMORY ;
  903.     sndBufSize -= 256 ;            /* 256Byteはクッションに開けておく */
  904.  
  905.     head = (SNDHEAD *)sndBuf1 ;        /* 架空のデータを入れて万が一を防ぐ */
  906.     for( i=0 ; i<8 ; i++ )
  907.         head->name[i] = '\0' ;
  908.     head->id = 0 ;
  909.     head->length = 0 ;
  910.     head->looppoint = 0 ;
  911.     head->looplength = 0 ;
  912.     head->freq = 0 ;
  913.     head->adjust = 0 ;
  914.     head->note = 0 ;
  915.     head = (SNDHEAD *)sndBuf2 ;        /* 架空のデータを入れて万が一を防ぐ */
  916.     for( i=0 ; i<8 ; i++ )
  917.         head->name[i] = '\0' ;
  918.     head->id = 0 ;
  919.     head->length = 0 ;
  920.     head->looppoint = 0 ;
  921.     head->looplength = 0 ;
  922.     head->freq = 0 ;
  923.     head->adjust = 0 ;
  924.     head->note = 0 ;
  925.  
  926.     return NOERR ;
  927. }
  928.  
  929. /*    終了処理    */
  930.  
  931. int    quitFunc()
  932. {
  933.     MMI_SetHaltFlag( TRUE ) ;
  934.  
  935.     return NOERR ;
  936. }
  937.  
  938. /*    あばうと表示    */
  939.  
  940. int    aboutFunc()
  941. {
  942.     MMI_SendMessage( alertId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;
  943.     MMI_SendMessage( alertId, MM_SHOW, 0 ) ;
  944.  
  945.     MMI_ExecSystem() ;
  946.  
  947.     MMI_SendMessage( alertId, MM_ERASE, 0 ) ;
  948.     MMI_SendMessage( alertId, MM_DETACH, 0 ) ;
  949.     return NOERR ;
  950. }
  951.  
  952. /*    あばうと表示確認    */
  953.  
  954. int    aboutOKFunc(kobj, messId, argc, pev, trigger)
  955. int        kobj ;
  956. int        messId ;
  957. int        argc ;
  958. EVENT    *pev ;
  959. int        trigger ;
  960. {
  961.     MMI_SetHaltFlag( TRUE ) ;
  962.  
  963.     return NOERR ;
  964. }
  965.  
  966. /* 情報表示 */
  967.  
  968. sndInf()
  969. {
  970.     SNDHEAD *head ;
  971.     int var, min, max, delta, ptColumn ;
  972.     int f ;
  973.  
  974.     head = (SNDHEAD *)sndBuf1 ;
  975.  
  976.     MMI_SendMessage( infNumId[0], MM_GETNUMBOX, 5, /* data length */
  977.                             &var, &min, &max, &delta, &ptColumn ) ;
  978.     MMI_SendMessage( infNumId[0], MM_SETNUMBOX, 5,
  979.                         head->length, 0, head->length, delta, ptColumn ) ;
  980.  
  981.     MMI_SendMessage( infNumId[1], MM_GETNUMBOX, 5, /* length point */
  982.                             &var, &min, &max, &delta, &ptColumn ) ;
  983.     MMI_SendMessage( infNumId[1], MM_SETNUMBOX, 5,
  984.                     head->looppoint, 0, head->looppoint, delta, ptColumn ) ;
  985.  
  986.     MMI_SendMessage( infNumId[2], MM_GETNUMBOX, 5, /* loop length */
  987.                             &var, &min, &max, &delta, &ptColumn ) ;
  988.     MMI_SendMessage( infNumId[2], MM_SETNUMBOX, 5,
  989.                     head->looplength, 0, head->looplength, delta, ptColumn ) ;
  990.  
  991.     f = ( head->freq ) * 1000 / 0x62 ;                /* freq */
  992.     f = ( f + 50 )/100 * 100 ;        /* 10の位を四捨五入 */
  993.     MMI_SendMessage( infNumId[3], MM_GETNUMBOX, 5, /* loop length */
  994.                             &var, &min, &max, &delta, &ptColumn ) ;
  995.     MMI_SendMessage( infNumId[3], MM_SETNUMBOX, 5,
  996.                                     f, 0, f, delta, ptColumn ) ;
  997.  
  998.     MMI_SendMessage( infNumId[4], MM_GETNUMBOX, 5, /* loop length */
  999.                             &var, &min, &max, &delta, &ptColumn ) ;
  1000.     MMI_SendMessage( infNumId[4], MM_SETNUMBOX, 5,
  1001.                     head->adjust, -32768, 32767, delta, ptColumn ) ;
  1002.  
  1003.     MMI_SendMessage( infNumId[5], MM_GETNUMBOX, 5, /* loop length */
  1004.                             &var, &min, &max, &delta, &ptColumn ) ;
  1005.     MMI_SendMessage( infNumId[5], MM_SETNUMBOX, 5,
  1006.                     head->note, 0, head->note, delta, ptColumn ) ;
  1007.  
  1008.  
  1009.     MMI_SendMessage( infDialogId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;
  1010.     MMI_SendMessage( infDialogId, MM_SHOW, 0 ) ;    /* 全体を見せる */
  1011.  
  1012.     MMI_ExecSystem() ;        /* Dialog表示へ・・・イベントループ */
  1013.  
  1014.     MMI_SendMessage( infDialogId, MM_ERASE, 0 ) ;
  1015.     MMI_SendMessage( infDialogId, MM_DETACH, 0 ) ;
  1016.  
  1017.     return NOERR ;
  1018. }
  1019.  
  1020. /* 情報確認 */
  1021.  
  1022. int    infOkFunc(kobj, messId, argc, pev, trigger)
  1023. int        kobj ;
  1024. int        messId ;
  1025. int        argc ;
  1026. EVENT    *pev ;
  1027. int        trigger ;
  1028. {
  1029.     MMI_SetHaltFlag( TRUE ) ;
  1030.     return NOERR ;
  1031. }
  1032.  
  1033. /* error 表示ルーチン */
  1034.  
  1035. int errorCheck( int number )
  1036. {
  1037.     /*
  1038.     #define    OUT_OF_MEMORY        7
  1039.     #define    ILLIGAL_FILENAME    55
  1040.     #define    ILLIGAL_DATA        58
  1041.     #define    CANT_LOAD            1
  1042.     #define    CANT_SAVE            2
  1043.     */
  1044.  
  1045.     MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
  1046.          "エラーが発生しました。" ) ;
  1047.     if( number == OUT_OF_MEMORY )
  1048.         MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
  1049.          "メモリが足りません。" ) ;
  1050.     if( number == ILLIGAL_FILENAME )
  1051.         MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
  1052.          "ファイル名が正しくありません。" ) ;
  1053.     if( number == ILLIGAL_DATA )
  1054.         MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
  1055.          "データ形式が正しくありません。" ) ;
  1056.     if( number == CANT_LOAD )
  1057.         MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
  1058.          "ロードできませんでした。" ) ;
  1059.     if( number == CANT_SAVE )
  1060.         MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
  1061.          "セーブできませんでした。" ) ;
  1062.  
  1063.     MMI_SendMessage( errorId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;
  1064.     MMI_SendMessage( errorId, MM_SHOW, 0 ) ;
  1065.  
  1066.     MMI_ExecSystem() ;        /* Dialog表示へ・・・イベントループ */
  1067.  
  1068.     MMI_SendMessage( errorId, MM_ERASE, 0 ) ;
  1069.     MMI_SendMessage( errorId, MM_DETACH, 0 ) ;
  1070.  
  1071.     return NOERR;
  1072. }
  1073.  
  1074. /*    エラー表示確認    */
  1075.  
  1076. int    errorOKFunc(kobj, messId, argc, pev, trigger)
  1077. int        kobj ;
  1078. int        messId ;
  1079. int        argc ;
  1080. EVENT    *pev ;
  1081. int        trigger ;
  1082. {
  1083.     MMI_SetHaltFlag( TRUE ) ;
  1084.  
  1085.     return NOERR ;
  1086. }
  1087.  
  1088. /* マウスボタンチェック */
  1089.  
  1090. mouseSwCheck()
  1091. {
  1092.     int sw ;
  1093.  
  1094.     SND_joy_in_1( 0x01, &sw );
  1095.     sw = ((sw ^ 0xff) & 0x30) >> 4 ;
  1096.     return sw ;
  1097. }
  1098.  
  1099. /* アンドゥ用にデータを退避 */
  1100.  
  1101. sndBufTrans()
  1102. {
  1103.     SNDHEAD *head ;
  1104.  
  1105.     head = (SNDHEAD *)sndBuf1 ;
  1106.     if( (head->length) > (sndBufSize - 32) )
  1107.         head->length = sndBufSize - 32 ;
  1108.     sndTransfer( sndBuf1, sndBuf2 ) ;
  1109.  
  1110.     return NOERR ;
  1111. }
  1112.  
  1113. /* アンドゥ */
  1114.  
  1115. unDo()
  1116. {
  1117.     SNDHEAD *head ;
  1118.  
  1119.     head = (SNDHEAD *)sndBuf2 ;
  1120.     if( (head->length) > (sndBufSize - 32) )
  1121.         head->length = sndBufSize - 32 ;
  1122.     sndTransfer( sndBuf2, sndBuf1 ) ;
  1123.  
  1124.     return NOERR ;
  1125. }
  1126.  
  1127. /* 再生 */
  1128.  
  1129. sndPlay()
  1130. {
  1131.     SNDHEAD *head ;
  1132.     int sw, st ;
  1133.  
  1134.     head = (SNDHEAD *)sndBuf1 ;
  1135.  
  1136.     if( (head->freq) <= 0 )return NOERR ;
  1137.                         /* サンプリングレートが小さい場合は実行しない */
  1138.  
  1139.     SND_elevol_mute( 0x00000001 ) ;
  1140.     SND_pcm_sound_delete( -1 );
  1141.     SND_pcm_mode_set( 1 );
  1142.     SND_pcm_play( 71, head->note, 127, sndBuf1 );
  1143. //    SND_pcm_play2( 71, head->note, 127, sndBuf1 );
  1144.  
  1145.     while( mouseSwCheck() ) ;
  1146.  
  1147.     do                                      /* ループ開始 */
  1148.     {
  1149.         sw = mouseSwCheck() ;          /* マウス情報読み込み */
  1150.         st = SND_pcm_status( 71 ) ;     /* 再生状態入手 */
  1151.     }
  1152.     while( (sw == 0) && (st != 0) ) ;
  1153.        /* 再生終了になるか,マウスボタンが押されるまでループする */
  1154.  
  1155.     SND_pcm_play_stop( 71 ) ;            /* 再生をストップする */
  1156.     SND_elevol_mute( 0x00000000 ) ;
  1157.     return NOERR ;
  1158. }
  1159.  
  1160. /* メッセージのカラーを変えて表示する */
  1161.  
  1162. setMsgColor( int kobj, int color )
  1163. {
  1164.     OBJECT *pobj ;
  1165.     MSGL40 *data ;
  1166.  
  1167.     pobj = TL_getObjectPtr( kobj ) ;
  1168.     data = (MSGL40 *)(pobj->data) ;
  1169.     data->clr.ch = color ;
  1170.     MMI_SendMessage( kobj, MM_SHOW, 0 ) ;    /* 見せる */
  1171.  
  1172.     return NOERR ;
  1173. }
  1174.  
  1175.